home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / share / hplip / base / status.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-28  |  29.7 KB  |  1,209 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from __future__ import division
  5. import struct
  6. import cStringIO
  7. import xml.parsers.expat as expat
  8. import re
  9. from g import *
  10. from codes import *
  11. import pml
  12. import utils
  13. STATUS_REV_00 = 0
  14. STATUS_REV_01 = 1
  15. STATUS_REV_02 = 2
  16. STATUS_REV_03 = 3
  17. STATUS_REV_04 = 4
  18. STATUS_REV_V = 255
  19. STATUS_REV_UNKNOWN = 254
  20. vstatus_xlate = {
  21.     'busy': STATUS_PRINTER_BUSY,
  22.     'idle': STATUS_PRINTER_IDLE,
  23.     'prnt': STATUS_PRINTER_PRINTING,
  24.     'offf': STATUS_PRINTER_TURNING_OFF,
  25.     'rprt': STATUS_PRINTER_REPORT_PRINTING,
  26.     'cncl': STATUS_PRINTER_CANCELING,
  27.     'iost': STATUS_PRINTER_IO_STALL,
  28.     'dryw': STATUS_PRINTER_DRY_WAIT_TIME,
  29.     'penc': STATUS_PRINTER_PEN_CHANGE,
  30.     'oopa': STATUS_PRINTER_OUT_OF_PAPER,
  31.     'bnej': STATUS_PRINTER_BANNER_EJECT,
  32.     'bnmz': STATUS_PRINTER_BANNER_MISMATCH,
  33.     'phmz': STATUS_PRINTER_PHOTO_MISMATCH,
  34.     'dpmz': STATUS_PRINTER_DUPLEX_MISMATCH,
  35.     'pajm': STATUS_PRINTER_MEDIA_JAM,
  36.     'cars': STATUS_PRINTER_CARRIAGE_STALL,
  37.     'paps': STATUS_PRINTER_PAPER_STALL,
  38.     'penf': STATUS_PRINTER_PEN_FAILURE,
  39.     'erro': STATUS_PRINTER_HARD_ERROR,
  40.     'pwdn': STATUS_PRINTER_POWER_DOWN,
  41.     'fpts': STATUS_PRINTER_FRONT_PANEL_TEST,
  42.     'clno': STATUS_PRINTER_CLEAN_OUT_TRAY_MISSING }
  43. REVISION_2_TYPE_MAP = {
  44.     0: AGENT_TYPE_NONE,
  45.     1: AGENT_TYPE_BLACK,
  46.     2: AGENT_TYPE_CYAN,
  47.     3: AGENT_TYPE_MAGENTA,
  48.     4: AGENT_TYPE_YELLOW,
  49.     5: AGENT_TYPE_BLACK,
  50.     6: AGENT_TYPE_CYAN,
  51.     7: AGENT_TYPE_MAGENTA,
  52.     8: AGENT_TYPE_YELLOW }
  53. STATUS_BLOCK_UNKNOWN = {
  54.     'revision': STATUS_REV_UNKNOWN,
  55.     'agents': [],
  56.     'status-code': STATUS_UNKNOWN }
  57. NUM_PEN_POS = {
  58.     STATUS_REV_00: 16,
  59.     STATUS_REV_01: 16,
  60.     STATUS_REV_02: 16,
  61.     STATUS_REV_03: 18,
  62.     STATUS_REV_04: 22 }
  63. PEN_DATA_SIZE = {
  64.     STATUS_REV_00: 8,
  65.     STATUS_REV_01: 8,
  66.     STATUS_REV_02: 4,
  67.     STATUS_REV_03: 8,
  68.     STATUS_REV_04: 8 }
  69. STATUS_POS = {
  70.     STATUS_REV_00: 14,
  71.     STATUS_REV_01: 14,
  72.     STATUS_REV_02: 14,
  73.     STATUS_REV_03: 16,
  74.     STATUS_REV_04: 20 }
  75.  
  76. def parseSStatus(s, z = ''):
  77.     revision = ''
  78.     pens = []
  79.     top_door = TOP_DOOR_NOT_PRESENT
  80.     stat = STATUS_UNKNOWN
  81.     supply_door = SUPPLY_DOOR_NOT_PRESENT
  82.     duplexer = DUPLEXER_NOT_PRESENT
  83.     photo_tray = PHOTO_TRAY_NOT_PRESENT
  84.     in_tray1 = IN_TRAY_NOT_PRESENT
  85.     in_tray2 = IN_TRAY_NOT_PRESENT
  86.     media_path = MEDIA_PATH_NOT_PRESENT
  87.     Z_SIZE = 6
  88.     
  89.     try:
  90.         z1 = []
  91.         if len(z) > 0:
  92.             z_fields = z.split(',')
  93.             for z_field in z_fields:
  94.                 if len(z_field) > 2 and z_field[:2] == '05':
  95.                     z1s = z_field[2:]
  96.                     z1 = [ int(x, 16) for x in z1s ]
  97.                     continue
  98.                 []
  99.             
  100.         
  101.         s1 = [ int(x, 16) for x in s ]
  102.         revision = s1[1]
  103.         if revision <= revision:
  104.             pass
  105.         elif not revision <= STATUS_REV_04:
  106.             raise AssertionError
  107.         []
  108.         top_door = bool(s1[2] & 0x8L) + s1[2] & 0x1L
  109.         supply_door = bool(s1[3] & 0x8L) + s1[3] & 0x1L
  110.         duplexer = bool(s1[4] & 0xCL) + s1[4] & 0x1L
  111.         photo_tray = bool(s1[5] & 0x8L) + s1[5] & 0x1L
  112.         if revision == STATUS_REV_02:
  113.             in_tray1 = bool(s1[6] & 0x8L) + s1[6] & 0x1L
  114.             in_tray2 = bool(s1[7] & 0x8L) + s1[7] & 0x1L
  115.         else:
  116.             in_tray1 = bool(s1[6] & 0x8L)
  117.             in_tray2 = bool(s1[7] & 0x8L)
  118.         media_path = bool(s1[8] & 0x8L) + (s1[8] & 0x1L) + (bool(s1[18] & 0x2L) << 1)
  119.         status_pos = STATUS_POS[revision]
  120.         status_byte = (s1[status_pos] << 4) + s1[status_pos + 1]
  121.         stat = status_byte + STATUS_PRINTER_BASE
  122.         pen = { }
  123.         c = NUM_PEN_POS[revision] + 1
  124.         d = 0
  125.         num_pens = s1[NUM_PEN_POS[revision]]
  126.         log.debug('Num pens=%d' % num_pens)
  127.         index = 0
  128.         pen_data_size = PEN_DATA_SIZE[revision]
  129.         for p in range(num_pens):
  130.             info = long(s[c:c + pen_data_size], 16)
  131.             pen['index'] = index
  132.             if pen_data_size == 4:
  133.                 pen['type'] = REVISION_2_TYPE_MAP.get(int((info & 0xF000L) >> 0xCL), 0)
  134.                 if index < num_pens / 2:
  135.                     pen['kind'] = AGENT_KIND_HEAD
  136.                 else:
  137.                     pen['kind'] = AGENT_KIND_SUPPLY
  138.                 pen['level-trigger'] = int((info & 0xE00L) >> 0x9L)
  139.                 pen['health'] = int((info & 0x180L) >> 0x7L)
  140.                 pen['level'] = int(info & 0x7FL)
  141.                 pen['id'] = 31
  142.             elif pen_data_size == 8:
  143.                 pen['kind'] = bool(info & 0x80000000L) + (bool(info & 0x40000000L) << 0x1L)
  144.                 pen['type'] = int((info & 0x3F000000L) >> 0x18L)
  145.                 pen['id'] = int((info & 16252928) >> 0x13L)
  146.                 pen['level-trigger'] = int((info & 0x70000L) >> 0x10L)
  147.                 pen['health'] = int((info & 0xC000L) >> 0xEL)
  148.                 pen['level'] = int(info & 0xFFL)
  149.             else:
  150.                 log.error('Pen data size error')
  151.             if len(z1) > 0:
  152.                 
  153.                 try:
  154.                     pen['dvc'] = long(z1s[d + 1:d + 5], 16)
  155.                     pen['virgin'] = bool(z1[d + 5] & 0x8L)
  156.                     pen['hp-ink'] = bool(z1[d + 5] & 0x4L)
  157.                     pen['known'] = bool(z1[d + 5] & 0x2L)
  158.                     pen['ack'] = bool(z1[d + 5] & 0x1L)
  159.                 except IndexError:
  160.                     pen['dvc'] = 0
  161.                     pen['virgin'] = 0
  162.                     pen['hp-ink'] = 0
  163.                     pen['known'] = 0
  164.                     pen['ack'] = 0
  165.                 except:
  166.                     None<EXCEPTION MATCH>IndexError
  167.                 
  168.  
  169.             None<EXCEPTION MATCH>IndexError
  170.             index += 1
  171.             pens.append(pen)
  172.             log.debug('Pen %d: %s' % (p, pen))
  173.             pen = { }
  174.             c += pen_data_size
  175.             d += Z_SIZE
  176.     except (IndexError, ValueError, TypeError):
  177.         e = None
  178.         log.warn('Status parsing error: %s' % str(e))
  179.  
  180.     return {
  181.         'revision': revision,
  182.         'agents': pens,
  183.         'top-door': top_door,
  184.         'status-code': stat,
  185.         'supply-door': supply_door,
  186.         'duplexer': duplexer,
  187.         'photo-tray': photo_tray,
  188.         'in-tray1': in_tray1,
  189.         'in-tray2': in_tray2,
  190.         'media-path': media_path }
  191.  
  192.  
  193. def parseVStatus(s):
  194.     pens = []
  195.     pen = { }
  196.     c = 0
  197.     fields = s.split(',')
  198.     log.debug(fields)
  199.     f0 = fields[0]
  200.     if len(f0) == 20:
  201.         pass
  202.     elif len(f0) == 8:
  203.         for p in f0:
  204.             if c == 0:
  205.                 c += 1
  206.                 continue
  207.             if c == 1:
  208.                 if p in ('a', 'A'):
  209.                     pen['type'] = AGENT_TYPE_NONE
  210.                     pen['kind'] = AGENT_KIND_NONE
  211.                 
  212.                 c += 1
  213.                 continue
  214.             if c == 2:
  215.                 pen['health'] = AGENT_HEALTH_OK
  216.                 pen['kind'] = AGENT_KIND_HEAD_AND_SUPPLY
  217.                 if p in ('b', 'B'):
  218.                     pen['type'] = AGENT_TYPE_BLACK
  219.                 elif p in ('c', 'C'):
  220.                     pen['type'] = AGENT_TYPE_CMY
  221.                 elif p in ('d', 'D'):
  222.                     pen['type'] = AGENT_TYPE_KCM
  223.                 elif p in ('u', 'U'):
  224.                     pen['type'] = AGENT_TYPE_NONE
  225.                     pen['health'] = AGENT_HEALTH_MISINSTALLED
  226.                 
  227.                 c += 1
  228.                 continue
  229.             if c == 3:
  230.                 if p == '0':
  231.                     pen['state'] = 1
  232.                 else:
  233.                     pen['state'] = 0
  234.                 pen['level'] = 0
  235.                 i = 8
  236.                 while True:
  237.                     
  238.                     try:
  239.                         f = fields[i]
  240.                     except IndexError:
  241.                         break
  242.  
  243.                     if f[:2] == 'KP' and pen['type'] == AGENT_TYPE_BLACK:
  244.                         pen['level'] = int(f[2:])
  245.                     elif f[:2] == 'CP' and pen['type'] == AGENT_TYPE_CMY:
  246.                         pen['level'] = int(f[2:])
  247.                     
  248.                     i += 1
  249.                 pens.append(pen)
  250.                 pen = { }
  251.                 c = 0
  252.                 continue
  253.         
  254.     
  255.     
  256.     try:
  257.         fields[2]
  258.     except IndexError:
  259.         top_lid = 1
  260.  
  261.     if fields[2] == 'DN':
  262.         top_lid = 1
  263.     else:
  264.         top_lid = 2
  265.     
  266.     try:
  267.         stat = vstatus_xlate.get(fields[3].lower(), STATUS_PRINTER_IDLE)
  268.     except IndexError:
  269.         stat = STATUS_PRINTER_IDLE
  270.  
  271.     return {
  272.         'revision': STATUS_REV_V,
  273.         'agents': pens,
  274.         'top-door': top_lid,
  275.         'status-code': stat,
  276.         'supply-door': SUPPLY_DOOR_NOT_PRESENT,
  277.         'duplexer': DUPLEXER_NOT_PRESENT,
  278.         'photo-tray': PHOTO_TRAY_NOT_PRESENT,
  279.         'in-tray1': IN_TRAY_NOT_PRESENT,
  280.         'in-tray2': IN_TRAY_NOT_PRESENT,
  281.         'media-path': MEDIA_PATH_CUT_SHEET }
  282.  
  283.  
  284. def parseStatus(DeviceID):
  285.     if 'VSTATUS' in DeviceID:
  286.         return parseVStatus(DeviceID['VSTATUS'])
  287.     if 'S' in DeviceID:
  288.         return parseSStatus(DeviceID['S'], DeviceID.get('Z', ''))
  289.     return STATUS_BLOCK_UNKNOWN
  290.  
  291.  
  292. def LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state):
  293.     stat = STATUS_PRINTER_IDLE
  294.     if device_status in (pml.DEVICE_STATUS_WARNING, pml.DEVICE_STATUS_DOWN):
  295.         if detected_error_state & pml.DETECTED_ERROR_STATE_LOW_PAPER_MASK and not (detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK):
  296.             stat = STATUS_PRINTER_LOW_PAPER
  297.         elif detected_error_state & pml.DETECTED_ERROR_STATE_NO_PAPER_MASK:
  298.             stat = STATUS_PRINTER_OUT_OF_PAPER
  299.         elif detected_error_state & pml.DETECTED_ERROR_STATE_DOOR_OPEN_MASK:
  300.             stat = STATUS_PRINTER_DOOR_OPEN
  301.         elif detected_error_state & pml.DETECTED_ERROR_STATE_JAMMED_MASK:
  302.             stat = STATUS_PRINTER_MEDIA_JAM
  303.         elif detected_error_state & pml.DETECTED_ERROR_STATE_OUT_CART_MASK:
  304.             stat = STATUS_PRINTER_NO_TONER
  305.         elif detected_error_state & pml.DETECTED_ERROR_STATE_LOW_CART_MASK:
  306.             stat = STATUS_PRINTER_LOW_TONER
  307.         elif detected_error_state == pml.DETECTED_ERROR_STATE_SERVICE_REQUEST_MASK:
  308.             stat = STATUS_PRINTER_SERVICE_REQUEST
  309.         elif detected_error_state & pml.DETECTED_ERROR_STATE_OFFLINE_MASK:
  310.             stat = STATUS_PRINTER_OFFLINE
  311.         
  312.     elif printer_status == pml.PRINTER_STATUS_IDLE:
  313.         stat = STATUS_PRINTER_IDLE
  314.     elif printer_status == pml.PRINTER_STATUS_PRINTING:
  315.         stat = STATUS_PRINTER_PRINTING
  316.     elif printer_status == pml.PRINTER_STATUS_WARMUP:
  317.         stat = STATUS_PRINTER_WARMING_UP
  318.     
  319.     return stat
  320.  
  321. COLORANT_INDEX_TO_AGENT_TYPE_MAP = {
  322.     'other': AGENT_TYPE_UNSPECIFIED,
  323.     'unknown': AGENT_TYPE_UNSPECIFIED,
  324.     'blue': AGENT_TYPE_BLUE,
  325.     'cyan': AGENT_TYPE_CYAN,
  326.     'magenta': AGENT_TYPE_MAGENTA,
  327.     'yellow': AGENT_TYPE_YELLOW,
  328.     'black': AGENT_TYPE_BLACK }
  329. MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP = {
  330.     pml.OID_MARKER_SUPPLIES_TYPE_OTHER: AGENT_KIND_UNKNOWN,
  331.     pml.OID_MARKER_SUPPLIES_TYPE_UNKNOWN: AGENT_KIND_UNKNOWN,
  332.     pml.OID_MARKER_SUPPLIES_TYPE_TONER: AGENT_KIND_TONER_CARTRIDGE,
  333.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_TONER: AGENT_KIND_UNKNOWN,
  334.     pml.OID_MARKER_SUPPLIES_TYPE_INK: AGENT_KIND_SUPPLY,
  335.     pml.OID_MARKER_SUPPLIES_TYPE_INK_CART: AGENT_KIND_HEAD_AND_SUPPLY,
  336.     pml.OID_MARKER_SUPPLIES_TYPE_INK_RIBBON: AGENT_KIND_HEAD_AND_SUPPLY,
  337.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_INK: AGENT_KIND_UNKNOWN,
  338.     pml.OID_MARKER_SUPPLIES_TYPE_OPC: AGENT_KIND_DRUM_KIT,
  339.     pml.OID_MARKER_SUPPLIES_TYPE_DEVELOPER: AGENT_KIND_UNKNOWN,
  340.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL: AGENT_KIND_UNKNOWN,
  341.     pml.OID_MARKER_SUPPLIES_TYPE_SOLID_WAX: AGENT_KIND_UNKNOWN,
  342.     pml.OID_MARKER_SUPPLIES_TYPE_RIBBON_WAX: AGENT_KIND_UNKNOWN,
  343.     pml.OID_MARKER_SUPPLIES_TYPE_WASTE_WAX: AGENT_KIND_UNKNOWN,
  344.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER: AGENT_KIND_MAINT_KIT,
  345.     pml.OID_MARKER_SUPPLIES_TYPE_CORONA_WIRE: AGENT_KIND_UNKNOWN,
  346.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OIL_WICK: AGENT_KIND_UNKNOWN,
  347.     pml.OID_MARKER_SUPPLIES_TYPE_CLEANER_UNIT: AGENT_KIND_UNKNOWN,
  348.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_CLEANING_PAD: AGENT_KIND_UNKNOWN,
  349.     pml.OID_MARKER_SUPPLIES_TYPE_TRANSFER_UNIT: AGENT_KIND_TRANSFER_KIT,
  350.     pml.OID_MARKER_SUPPLIES_TYPE_TONER_CART: AGENT_KIND_TONER_CARTRIDGE,
  351.     pml.OID_MARKER_SUPPLIES_TYPE_FUSER_OILER: AGENT_KIND_UNKNOWN,
  352.     pml.OID_MARKER_SUPPLIES_TYPE_ADF_MAINT_KIT: AGENT_KIND_ADF_KIT }
  353.  
  354. def StatusType3(dev, parsedID):
  355.     
  356.     try:
  357.         dev.openPML()
  358.         (result_code, printer_status) = dev.getPML(pml.OID_PRINTER_STATUS, pml.INT_SIZE_BYTE)
  359.         (result_code, device_status) = dev.getPML(pml.OID_DEVICE_STATUS, pml.INT_SIZE_BYTE)
  360.         (result_code, cover_status) = dev.getPML(pml.OID_COVER_STATUS, pml.INT_SIZE_BYTE)
  361.         (result_code, value) = dev.getPML(pml.OID_DETECTED_ERROR_STATE)
  362.     except Error:
  363.         dev.closePML()
  364.         return {
  365.             'revision': STATUS_REV_UNKNOWN,
  366.             'agents': [],
  367.             'top-door': 0,
  368.             'status-code': STATUS_UNKNOWN,
  369.             'supply-door': 0,
  370.             'duplexer': 1,
  371.             'photo-tray': 0,
  372.             'in-tray1': 0,
  373.             'in-tray2': 0,
  374.             'media-path': 0 }
  375.  
  376.     
  377.     try:
  378.         detected_error_state = struct.unpack('B', value[0])[0]
  379.     except (IndexError, TypeError):
  380.         detected_error_state = pml.DETECTED_ERROR_STATE_OFFLINE_MASK
  381.  
  382.     agents = []
  383.     x = 1
  384.     while True:
  385.         log.debug('%s Agent: %d %s' % ('**********', x, '**********'))
  386.         log.debug('OID_MARKER_SUPPLIES_TYPE_%d:' % x)
  387.         oid = (pml.OID_MARKER_SUPPLIES_TYPE_x % x, pml.OID_MARKER_SUPPLIES_TYPE_x_TYPE)
  388.         (result_code, value) = dev.getPML(oid, pml.INT_SIZE_BYTE)
  389.         if result_code != ERROR_SUCCESS or value is None:
  390.             log.debug('End of supply information.')
  391.             break
  392.         
  393.         for a in MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP:
  394.             if value == a:
  395.                 agent_kind = MARKER_SUPPLES_TYPE_TO_AGENT_KIND_MAP[a]
  396.                 break
  397.                 continue
  398.         else:
  399.             agent_kind = AGENT_KIND_UNKNOWN
  400.         log.debug('OID_MARKER_SUPPLIES_LEVEL_%d:' % x)
  401.         oid = (pml.OID_MARKER_SUPPLIES_LEVEL_x % x, pml.OID_MARKER_SUPPLIES_LEVEL_x_TYPE)
  402.         (result_code, agent_level) = dev.getPML(oid)
  403.         if result_code != ERROR_SUCCESS:
  404.             log.debug('Failed')
  405.             break
  406.         
  407.         log.debug('agent%d-level: %d' % (x, agent_level))
  408.         log.debug('OID_MARKER_SUPPLIES_MAX_%d:' % x)
  409.         oid = (pml.OID_MARKER_SUPPLIES_MAX_x % x, pml.OID_MARKER_SUPPLIES_MAX_x_TYPE)
  410.         (result_code, agent_max) = dev.getPML(oid)
  411.         if agent_max == 0:
  412.             agent_max = 1
  413.         
  414.         if result_code != ERROR_SUCCESS:
  415.             log.debug('Failed')
  416.             break
  417.         
  418.         log.debug('agent%d-max: %d' % (x, agent_max))
  419.         log.debug('OID_MARKER_SUPPLIES_COLORANT_INDEX_%d:' % x)
  420.         oid = (pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x % x, pml.OID_MARKER_SUPPLIES_COLORANT_INDEX_x_TYPE)
  421.         (result_code, colorant_index) = dev.getPML(oid)
  422.         if result_code != ERROR_SUCCESS:
  423.             log.debug('Failed')
  424.             agent_type = AGENT_TYPE_BLACK
  425.         else:
  426.             log.debug('Colorant index: %d' % colorant_index)
  427.             log.debug('OID_MARKER_COLORANT_VALUE_%d' % x)
  428.             oid = (pml.OID_MARKER_COLORANT_VALUE_x % colorant_index, pml.OID_MARKER_COLORANT_VALUE_x_TYPE)
  429.             (result_code, colorant_value) = dev.getPML(oid)
  430.             if result_code != ERROR_SUCCESS:
  431.                 log.debug('Failed. Defaulting to black.')
  432.                 agent_type = AGENT_TYPE_BLACK
  433.             
  434.             if agent_kind in (AGENT_KIND_MAINT_KIT, AGENT_KIND_ADF_KIT, AGENT_KIND_DRUM_KIT, AGENT_KIND_TRANSFER_KIT):
  435.                 agent_type = AGENT_TYPE_UNSPECIFIED
  436.             else:
  437.                 agent_type = AGENT_TYPE_BLACK
  438.                 if result_code != ERROR_SUCCESS:
  439.                     log.debug('OID_MARKER_SUPPLIES_DESCRIPTION_%d:' % x)
  440.                     oid = (pml.OID_MARKER_SUPPLIES_DESCRIPTION_x % x, pml.OID_MARKER_SUPPLIES_DESCRIPTION_x_TYPE)
  441.                     (result_code, colorant_value) = dev.getPML(oid)
  442.                     if result_code != ERROR_SUCCESS:
  443.                         log.debug('Failed')
  444.                         break
  445.                     
  446.                     if colorant_value is not None:
  447.                         log.debug('colorant value: %s' % colorant_value)
  448.                         colorant_value = colorant_value.lower().strip()
  449.                         for c in COLORANT_INDEX_TO_AGENT_TYPE_MAP:
  450.                             if colorant_value.find(c) >= 0:
  451.                                 agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP[c]
  452.                                 break
  453.                                 continue
  454.                         else:
  455.                             agent_type = AGENT_TYPE_BLACK
  456.                     
  457.                 elif colorant_value is not None:
  458.                     log.debug('colorant value: %s' % colorant_value)
  459.                     agent_type = COLORANT_INDEX_TO_AGENT_TYPE_MAP.get(colorant_value, AGENT_TYPE_BLACK)
  460.                 
  461.                 if agent_type == AGENT_TYPE_NONE:
  462.                     if agent_kind == AGENT_KIND_TONER_CARTRIDGE:
  463.                         agent_type = AGENT_TYPE_BLACK
  464.                     else:
  465.                         agent_type = AGENT_TYPE_UNSPECIFIED
  466.                 
  467.         log.debug('OID_MARKER_STATUS_%d:' % x)
  468.         oid = (pml.OID_MARKER_STATUS_x % x, pml.OID_MARKER_STATUS_x_TYPE)
  469.         (result_code, agent_status) = dev.getPML(oid)
  470.         if result_code != ERROR_SUCCESS:
  471.             log.debug('Failed')
  472.             agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  473.             agent_health = AGENT_HEALTH_OK
  474.         else:
  475.             agent_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  476.             if agent_status is None:
  477.                 agent_health = AGENT_HEALTH_OK
  478.             elif agent_status == pml.OID_MARKER_STATUS_OK:
  479.                 agent_health = AGENT_HEALTH_OK
  480.             elif agent_status == pml.OID_MARKER_STATUS_MISINSTALLED:
  481.                 agent_health = AGENT_HEALTH_MISINSTALLED
  482.             elif agent_status in (pml.OID_MARKER_STATUS_LOW_TONER_CONT, pml.OID_MARKER_STATUS_LOW_TONER_STOP):
  483.                 agent_health = AGENT_HEALTH_OK
  484.                 agent_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  485.             else:
  486.                 agent_health = AGENT_HEALTH_OK
  487.         agent_level = int((agent_level / agent_max) * 100)
  488.         log.debug('agent%d: kind=%d, type=%d, health=%d, level=%d, level-trigger=%d' % (x, agent_kind, agent_type, agent_health, agent_level, agent_trigger))
  489.         agents.append({
  490.             'kind': agent_kind,
  491.             'type': agent_type,
  492.             'health': agent_health,
  493.             'level': agent_level,
  494.             'level-trigger': agent_trigger })
  495.         x += 1
  496.         if x > 20:
  497.             break
  498.             continue
  499.     if not printer_status:
  500.         pass
  501.     printer_status = STATUS_PRINTER_IDLE
  502.     log.debug('printer_status=%d' % printer_status)
  503.     if not device_status:
  504.         pass
  505.     device_status = pml.DEVICE_STATUS_RUNNING
  506.     log.debug('device_status=%d' % device_status)
  507.     if not cover_status:
  508.         pass
  509.     cover_status = pml.COVER_STATUS_CLOSED
  510.     log.debug('cover_status=%d' % cover_status)
  511.     if not detected_error_state:
  512.         pass
  513.     detected_error_state = pml.DETECTED_ERROR_STATE_NO_ERROR
  514.     log.debug('detected_error_state=%d (0x%x)' % (detected_error_state, detected_error_state))
  515.     stat = LaserJetDeviceStatusToPrinterStatus(device_status, printer_status, detected_error_state)
  516.     log.debug('Printer status=%d' % stat)
  517.     if stat == STATUS_PRINTER_DOOR_OPEN:
  518.         supply_door = 0
  519.     else:
  520.         supply_door = 1
  521.     return {
  522.         'revision': STATUS_REV_UNKNOWN,
  523.         'agents': agents,
  524.         'top-door': cover_status,
  525.         'status-code': stat,
  526.         'supply-door': supply_door,
  527.         'duplexer': 1,
  528.         'photo-tray': 0,
  529.         'in-tray1': 1,
  530.         'in-tray2': 1,
  531.         'media-path': 1 }
  532.  
  533.  
  534. def setup_panel_translator():
  535.     global PANEL_TRANSLATOR_FUNC
  536.     printables = list('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\n!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~')
  537.     map = { }
  538.     for x in range(0, 256):
  539.         pass
  540.     
  541.     map.update({
  542.         '\x10': '\xab',
  543.         '\x11': '\xbb',
  544.         '\x12': '\xa3',
  545.         '\x13': '\xbb',
  546.         '\x80': '\xab',
  547.         '\x81': '\xbb',
  548.         '\x82': '*',
  549.         '\x83': '*',
  550.         '\x85': '*',
  551.         '\xa0': '\xab',
  552.         '\x1f': '?',
  553.         '=': ' ' })
  554.     (frm, to) = ('', '')
  555.     map_keys = map.keys()
  556.     map_keys.sort()
  557.     for x in map_keys:
  558.         frm = ''.join([
  559.             frm,
  560.             x])
  561.         to = ''.join([
  562.             to,
  563.             map[x]])
  564.     
  565.     PANEL_TRANSLATOR_FUNC = utils.Translator(frm, to)
  566.  
  567. PANEL_TRANSLATOR_FUNC = None
  568. setup_panel_translator()
  569.  
  570. def PanelCheck(dev):
  571.     (line1, line2) = ('', '')
  572.     if dev.io_mode not in (IO_MODE_RAW, IO_MODE_UNI):
  573.         
  574.         try:
  575.             dev.openPML()
  576.         except Error:
  577.             pass
  578.  
  579.         oids = [
  580.             (pml.OID_HP_LINE1, pml.OID_HP_LINE2),
  581.             (pml.OID_SPM_LINE1, pml.OID_SPM_LINE2)]
  582.         for oid1, oid2 in oids:
  583.             (result, line1) = dev.getPML(oid1)
  584.             if result < pml.ERROR_MAX_OK:
  585.                 line1 = PANEL_TRANSLATOR_FUNC(line1).rstrip()
  586.                 if '\n' in line1:
  587.                     (line1, line2) = line1.split('\n', 1)
  588.                     break
  589.                 
  590.                 (result, line2) = dev.getPML(oid2)
  591.                 if result < pml.ERROR_MAX_OK:
  592.                     line2 = PANEL_TRANSLATOR_FUNC(line2).rstrip()
  593.                     break
  594.                 
  595.             result < pml.ERROR_MAX_OK
  596.         
  597.     
  598.     if not line1:
  599.         pass
  600.     if not line1:
  601.         pass
  602.     if not line2:
  603.         pass
  604.     return (bool(line2), '', '')
  605.  
  606. BATTERY_HEALTH_MAP = {
  607.     0: AGENT_HEALTH_OK,
  608.     1: AGENT_HEALTH_OVERTEMP,
  609.     2: AGENT_HEALTH_CHARGING,
  610.     3: AGENT_HEALTH_MISINSTALLED,
  611.     4: AGENT_HEALTH_FAILED }
  612. BATTERY_TRIGGER_MAP = {
  613.     0: AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
  614.     1: AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
  615.     2: AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
  616.     3: AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
  617.     4: AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
  618.     5: AGENT_LEVEL_TRIGGER_SUFFICIENT_0 }
  619. BATTERY_PML_TRIGGER_MAP = {
  620.     (100, 80): AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
  621.     (79, 60): AGENT_LEVEL_TRIGGER_SUFFICIENT_1,
  622.     (59, 40): AGENT_LEVEL_TRIGGER_SUFFICIENT_2,
  623.     (39, 30): AGENT_LEVEL_TRIGGER_SUFFICIENT_3,
  624.     (29, 20): AGENT_LEVEL_TRIGGER_SUFFICIENT_4,
  625.     (19, 10): AGENT_LEVEL_TRIGGER_MAY_BE_LOW,
  626.     (9, 5): AGENT_LEVEL_TRIGGER_PROBABLY_OUT,
  627.     (4, -1): AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT }
  628.  
  629. def BatteryCheck(dev, status_block, battery_check):
  630.     try_dynamic_counters = False
  631.     
  632.     try:
  633.         dev.openPML()
  634.     except Error:
  635.         if battery_check == STATUS_BATTERY_CHECK_STD:
  636.             log.debug('PML channel open failed. Trying dynamic counters...')
  637.             try_dynamic_counters = True
  638.         
  639.     except:
  640.         battery_check == STATUS_BATTERY_CHECK_STD
  641.     elif battery_check == STATUS_BATTERY_CHECK_PML:
  642.         (result, battery_level) = dev.getPML(pml.OID_BATTERY_LEVEL_2)
  643.         if result > pml.ERROR_MAX_OK:
  644.             status_block['agents'].append({
  645.                 'kind': AGENT_KIND_INT_BATTERY,
  646.                 'type': AGENT_TYPE_UNSPECIFIED,
  647.                 'health': AGENT_HEALTH_UNKNOWN,
  648.                 'level': 0,
  649.                 'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  650.             return None
  651.         status_block['agents'].append({
  652.             'kind': AGENT_KIND_INT_BATTERY,
  653.             'type': AGENT_TYPE_UNSPECIFIED,
  654.             'health': AGENT_HEALTH_OK,
  655.             'level': battery_level,
  656.             'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  657.         return None
  658.     else:
  659.         (result, battery_level) = dev.getPML(pml.OID_BATTERY_LEVEL)
  660.         (result, power_mode) = dev.getPML(pml.OID_POWER_MODE)
  661.         if battery_level is not None and power_mode is not None:
  662.             if power_mode & pml.POWER_MODE_BATTERY_LEVEL_KNOWN and battery_level >= 0:
  663.                 for x in BATTERY_PML_TRIGGER_MAP:
  664.                     if battery_level >= battery_level:
  665.                         pass
  666.                     elif battery_level > x[1]:
  667.                         battery_trigger_level = BATTERY_PML_TRIGGER_MAP[x]
  668.                         break
  669.                         continue
  670.                 
  671.                 if power_mode & pml.POWER_MODE_CHARGING:
  672.                     agent_health = AGENT_HEALTH_CHARGING
  673.                 elif power_mode & pml.POWER_MODE_DISCHARGING:
  674.                     agent_health = AGENT_HEALTH_DISCHARGING
  675.                 else:
  676.                     agent_health = AGENT_HEALTH_OK
  677.                 status_block['agents'].append({
  678.                     'kind': AGENT_KIND_INT_BATTERY,
  679.                     'type': AGENT_TYPE_UNSPECIFIED,
  680.                     'health': agent_health,
  681.                     'level': battery_level,
  682.                     'level-trigger': battery_trigger_level })
  683.                 return None
  684.             status_block['agents'].append({
  685.                 'kind': AGENT_KIND_INT_BATTERY,
  686.                 'type': AGENT_TYPE_UNSPECIFIED,
  687.                 'health': AGENT_HEALTH_UNKNOWN,
  688.                 'level': 0,
  689.                 'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  690.             return None
  691.         power_mode is not None
  692.         try_dynamic_counters = True
  693.     finally:
  694.         dev.closePML()
  695.  
  696.     if battery_check == STATUS_BATTERY_CHECK_STD and try_dynamic_counters:
  697.         
  698.         try:
  699.             battery_health = dev.getDynamicCounter(200)
  700.             battery_trigger_level = dev.getDynamicCounter(201)
  701.             battery_level = dev.getDynamicCounter(202)
  702.             status_block['agents'].append({
  703.                 'kind': AGENT_KIND_INT_BATTERY,
  704.                 'type': AGENT_TYPE_UNSPECIFIED,
  705.                 'health': BATTERY_HEALTH_MAP[battery_health],
  706.                 'level': battery_level,
  707.                 'level-trigger': BATTERY_TRIGGER_MAP[battery_trigger_level] })
  708.         except Error:
  709.             result > pml.ERROR_MAX_OK
  710.             result > pml.ERROR_MAX_OK
  711.             status_block['agents'].append({
  712.                 'kind': AGENT_KIND_INT_BATTERY,
  713.                 'type': AGENT_TYPE_UNSPECIFIED,
  714.                 'health': AGENT_HEALTH_UNKNOWN,
  715.                 'level': 0,
  716.                 'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  717.         except:
  718.             result > pml.ERROR_MAX_OK
  719.         finally:
  720.             dev.closePrint()
  721.  
  722.     else:
  723.         status_block['agents'].append({
  724.             'kind': AGENT_KIND_INT_BATTERY,
  725.             'type': AGENT_TYPE_UNSPECIFIED,
  726.             'health': AGENT_HEALTH_UNKNOWN,
  727.             'level': 0,
  728.             'level-trigger': AGENT_LEVEL_TRIGGER_SUFFICIENT_0 })
  729.  
  730.  
  731. def getPenConfiguration(s):
  732.     pens = [ p['type'] for p in s['agents'] ]
  733.     if utils.all(pens, (lambda x: x == AGENT_TYPE_NONE)):
  734.         return AGENT_CONFIG_NONE
  735.     if AGENT_TYPE_NONE in pens:
  736.         if AGENT_TYPE_BLACK in pens:
  737.             return AGENT_CONFIG_BLACK_ONLY
  738.         if AGENT_TYPE_CMY in pens:
  739.             return AGENT_CONFIG_COLOR_ONLY
  740.         if AGENT_TYPE_KCM in pens:
  741.             return AGENT_CONFIG_PHOTO_ONLY
  742.         if AGENT_TYPE_GGK in pens:
  743.             return AGENT_CONFIG_GREY_ONLY
  744.         return AGENT_CONFIG_INVALID
  745.     AGENT_TYPE_NONE in pens
  746.     if AGENT_TYPE_BLACK in pens and AGENT_TYPE_CMY in pens:
  747.         return AGENT_CONFIG_COLOR_AND_BLACK
  748.     if AGENT_TYPE_CMY in pens and AGENT_TYPE_KCM in pens:
  749.         return AGENT_CONFIG_COLOR_AND_PHOTO
  750.     if AGENT_TYPE_CMY in pens and AGENT_TYPE_GGK in pens:
  751.         return AGENT_CONFIG_COLOR_AND_GREY
  752.     return AGENT_CONFIG_INVALID
  753.  
  754.  
  755. def getFaxStatus(dev):
  756.     tx_active = False
  757.     rx_active = False
  758.     if dev.io_mode not in (IO_MODE_UNI, IO_MODE_RAW):
  759.         
  760.         try:
  761.             dev.openPML()
  762.             (result_code, tx_state) = dev.getPML(pml.OID_FAXJOB_TX_STATUS)
  763.             if result_code == ERROR_SUCCESS and tx_state:
  764.                 if tx_state not in (pml.FAXJOB_TX_STATUS_IDLE, pml.FAXJOB_TX_STATUS_DONE):
  765.                     tx_active = True
  766.                 
  767.             
  768.             (result_code, rx_state) = dev.getPML(pml.OID_FAXJOB_RX_STATUS)
  769.             if result_code == ERROR_SUCCESS and rx_state:
  770.                 if rx_state not in (pml.FAXJOB_RX_STATUS_IDLE, pml.FAXJOB_RX_STATUS_DONE):
  771.                     rx_active = True
  772.                 
  773.         finally:
  774.             dev.closePML()
  775.  
  776.     
  777.     return (tx_active, rx_active)
  778.  
  779. TYPE6_STATUS_CODE_MAP = {
  780.     0: STATUS_PRINTER_IDLE,
  781.     -19928: STATUS_PRINTER_IDLE,
  782.     -18995: STATUS_PRINTER_CANCELING,
  783.     -17974: STATUS_PRINTER_WARMING_UP,
  784.     -17973: STATUS_PRINTER_PEN_CLEANING,
  785.     -18993: STATUS_PRINTER_BUSY,
  786.     -17949: STATUS_PRINTER_BUSY,
  787.     -19720: STATUS_PRINTER_MANUAL_DUPLEX_BLOCK,
  788.     -19678: STATUS_PRINTER_BUSY,
  789.     -19695: STATUS_PRINTER_OUT_OF_PAPER,
  790.     -17985: STATUS_PRINTER_MEDIA_JAM,
  791.     -19731: STATUS_PRINTER_OUT_OF_PAPER,
  792.     -18974: STATUS_PRINTER_BUSY,
  793.     -19730: STATUS_PRINTER_OUT_OF_PAPER,
  794.     -19729: STATUS_PRINTER_OUT_OF_PAPER,
  795.     -19933: STATUS_PRINTER_HARD_ERROR,
  796.     -17984: STATUS_PRINTER_DOOR_OPEN,
  797.     -19694: STATUS_PRINTER_DOOR_OPEN,
  798.     -18992: STATUS_PRINTER_MANUAL_FEED_BLOCKED,
  799.     -19690: STATUS_PRINTER_MEDIA_JAM,
  800.     -19689: STATUS_PRINTER_MEDIA_JAM,
  801.     -19611: STATUS_PRINTER_MEDIA_JAM,
  802.     -19686: STATUS_PRINTER_MEDIA_JAM,
  803.     -19688: STATUS_PRINTER_MEDIA_JAM,
  804.     -19685: STATUS_PRINTER_MEDIA_JAM,
  805.     -19684: STATUS_PRINTER_MEDIA_JAM,
  806.     -18848: STATUS_PRINTER_MEDIA_JAM,
  807.     -18847: STATUS_PRINTER_MEDIA_JAM,
  808.     -18846: STATUS_PRINTER_MEDIA_JAM,
  809.     -19687: STATUS_PRINTER_MEDIA_JAM,
  810.     -17992: STATUS_PRINTER_MEDIA_JAM,
  811.     -19700: STATUS_PRINTER_HARD_ERROR,
  812.     -17996: STATUS_PRINTER_FUSER_ERROR,
  813.     -17983: STATUS_PRINTER_FUSER_ERROR,
  814.     -17982: STATUS_PRINTER_FUSER_ERROR,
  815.     -17981: STATUS_PRINTER_FUSER_ERROR,
  816.     -17971: STATUS_PRINTER_FUSER_ERROR,
  817.     -17995: STATUS_PRINTER_HARD_ERROR,
  818.     -17994: STATUS_PRINTER_HARD_ERROR,
  819.     -17993: STATUS_PRINTER_HARD_ERROR,
  820.     -18994: STATUS_PRINTER_HARD_ERROR,
  821.     -17986: STATUS_PRINTER_HARD_ERROR,
  822.     -19904: STATUS_PRINTER_HARD_ERROR,
  823.     -19701: STATUS_PRINTER_NON_HP_INK,
  824.     -19613: STATUS_PRINTER_IDLE,
  825.     -19654: STATUS_PRINTER_NON_HP_INK,
  826.     -19682: STATUS_PRINTER_HARD_ERROR,
  827.     -19693: STATUS_PRINTER_IDLE,
  828.     -19752: STATUS_PRINTER_LOW_TONER,
  829.     -19723: STATUS_PRINTER_BUSY,
  830.     -19703: STATUS_PRINTER_BUSY,
  831.     -19739: STATUS_PRINTER_NO_TONER,
  832.     -19927: STATUS_PRINTER_BUSY,
  833.     -19932: STATUS_PRINTER_BUSY,
  834.     -19931: STATUS_PRINTER_BUSY,
  835.     -11989: STATUS_PRINTER_BUSY,
  836.     -11995: STATUS_PRINTER_BUSY,
  837.     -19954: STATUS_PRINTER_CANCELING,
  838.     -19955: STATUS_PRINTER_REPORT_PRINTING,
  839.     -19956: STATUS_PRINTER_REPORT_PRINTING,
  840.     -19934: STATUS_PRINTER_HARD_ERROR,
  841.     -19930: STATUS_PRINTER_BUSY,
  842.     -11990: STATUS_PRINTER_DOOR_OPEN,
  843.     -11999: STATUS_PRINTER_MEDIA_JAM,
  844.     -12000: STATUS_PRINTER_MEDIA_JAM,
  845.     -11998: STATUS_PRINTER_MEDIA_JAM,
  846.     -11986: STATUS_PRINTER_HARD_ERROR,
  847.     -11994: STATUS_PRINTER_BUSY,
  848.     -14967: STATUS_PRINTER_BUSY,
  849.     -19912: STATUS_PRINTER_HARD_ERROR,
  850.     -14962: STATUS_PRINTER_BUSY,
  851.     -14971: STATUS_PRINTER_BUSY,
  852.     -14973: STATUS_PRINTER_BUSY,
  853.     -14972: STATUS_PRINTER_BUSY,
  854.     -14966: STATUS_PRINTER_DOOR_OPEN,
  855.     -14974: STATUS_PRINTER_MEDIA_JAM,
  856.     -14969: STATUS_PRINTER_HARD_ERROR,
  857.     -14968: STATUS_PRINTER_HARD_ERROR,
  858.     -12996: STATUS_PRINTER_BUSY,
  859.     -12994: STATUS_PRINTER_BUSY,
  860.     -12993: STATUS_PRINTER_BUSY,
  861.     -12991: STATUS_PRINTER_BUSY,
  862.     -12995: STATUS_PRINTER_BUSY,
  863.     -12997: STATUS_PRINTER_HARD_ERROR,
  864.     -12990: STATUS_PRINTER_BUSY,
  865.     -12998: STATUS_PRINTER_BUSY,
  866.     -13000: STATUS_PRINTER_DOOR_OPEN,
  867.     -12999: STATUS_PRINTER_MEDIA_JAM,
  868.     -13859: STATUS_PRINTER_BUSY,
  869.     -13858: STATUS_PRINTER_BUSY,
  870.     -13868: STATUS_PRINTER_BUSY,
  871.     -13867: STATUS_PRINTER_BUSY,
  872.     -13857: STATUS_PRINTER_BUSY,
  873.     -13856: STATUS_PRINTER_BUSY,
  874.     -13855: STATUS_PRINTER_BUSY,
  875.     -13854: STATUS_PRINTER_BUSY,
  876.     -13853: STATUS_PRINTER_BUSY,
  877.     -13839: STATUS_PRINTER_BUSY,
  878.     -13842: STATUS_PRINTER_BUSY,
  879.     -13838: STATUS_PRINTER_BUSY,
  880.     -13847: STATUS_PRINTER_BUSY,
  881.     -13846: STATUS_PRINTER_BUSY,
  882.     -13845: STATUS_PRINTER_BUSY,
  883.     -13844: STATUS_PRINTER_BUSY,
  884.     -13840: STATUS_PRINTER_BUSY,
  885.     -13843: STATUS_PRINTER_BUSY,
  886.     -13850: STATUS_PRINTER_BUSY,
  887.     -13851: STATUS_PRINTER_BUSY,
  888.     -13836: STATUS_PRINTER_BUSY,
  889.     -13864: STATUS_PRINTER_BUSY,
  890.     -13863: STATUS_PRINTER_BUSY,
  891.     -13865: STATUS_PRINTER_BUSY,
  892.     -13862: STATUS_PRINTER_BUSY,
  893.     -13837: STATUS_PRINTER_BUSY,
  894.     -13861: STATUS_PRINTER_BUSY,
  895.     -13866: STATUS_PRINTER_BUSY,
  896.     -13841: STATUS_PRINTER_BUSY,
  897.     -13848: STATUS_PRINTER_BUSY,
  898.     -13849: STATUS_PRINTER_BUSY }
  899.  
  900. def StatusType6(dev):
  901.     info_device_status = cStringIO.StringIO()
  902.     info_ssp = cStringIO.StringIO()
  903.     
  904.     try:
  905.         dev.getEWSUrl('/hp/device/info_device_status.xml', info_device_status)
  906.         dev.getEWSUrl('/hp/device/info_ssp.xml', info_ssp)
  907.     except:
  908.         pass
  909.  
  910.     info_device_status = info_device_status.getvalue()
  911.     info_ssp = info_ssp.getvalue()
  912.     device_status = { }
  913.     ssp = { }
  914.     if info_device_status:
  915.         
  916.         try:
  917.             log.debug_block('info_device_status', info_device_status)
  918.             device_status = utils.XMLToDictParser().parseXML(info_device_status)
  919.             log.debug(device_status)
  920.         except expat.ExpatError:
  921.             log.error('Device Status XML parse error')
  922.             device_status = { }
  923.         except:
  924.             None<EXCEPTION MATCH>expat.ExpatError
  925.         
  926.  
  927.     None<EXCEPTION MATCH>expat.ExpatError
  928.     if info_ssp:
  929.         
  930.         try:
  931.             log.debug_block('info_spp', info_ssp)
  932.             ssp = utils.XMLToDictParser().parseXML(info_ssp)
  933.             log.debug(ssp)
  934.         except expat.ExpatError:
  935.             log.error('SSP XML parse error')
  936.             ssp = { }
  937.         except:
  938.             None<EXCEPTION MATCH>expat.ExpatError
  939.         
  940.  
  941.     None<EXCEPTION MATCH>expat.ExpatError
  942.     status_code = device_status.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
  943.     if not status_code:
  944.         status_code = ssp.get('devicestatuspage-devicestatus-statuslist-status-code-0', 0)
  945.     
  946.     black_supply_level = device_status.get('devicestatuspage-suppliesstatus-blacksupply-percentremaining', 0)
  947.     black_supply_low = ssp.get('suppliesstatuspage-blacksupply-lowreached', 0)
  948.     agents = []
  949.     agents.append({
  950.         'kind': AGENT_KIND_TONER_CARTRIDGE,
  951.         'type': AGENT_TYPE_BLACK,
  952.         'health': 0,
  953.         'level': black_supply_level,
  954.         'level-trigger': 0 })
  955.     if dev.tech_type == TECH_TYPE_COLOR_LASER:
  956.         cyan_supply_level = device_status.get('devicestatuspage-suppliesstatus-cyansupply-percentremaining', 0)
  957.         agents.append({
  958.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  959.             'type': AGENT_TYPE_CYAN,
  960.             'health': 0,
  961.             'level': cyan_supply_level,
  962.             'level-trigger': 0 })
  963.         magenta_supply_level = device_status.get('devicestatuspage-suppliesstatus-magentasupply-percentremaining', 0)
  964.         agents.append({
  965.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  966.             'type': AGENT_TYPE_MAGENTA,
  967.             'health': 0,
  968.             'level': magenta_supply_level,
  969.             'level-trigger': 0 })
  970.         yellow_supply_level = device_status.get('devicestatuspage-suppliesstatus-yellowsupply-percentremaining', 0)
  971.         agents.append({
  972.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  973.             'type': AGENT_TYPE_YELLOW,
  974.             'health': 0,
  975.             'level': yellow_supply_level,
  976.             'level-trigger': 0 })
  977.     
  978.     return {
  979.         'revision': STATUS_REV_UNKNOWN,
  980.         'agents': agents,
  981.         'top-door': 0,
  982.         'supply-door': 0,
  983.         'duplexer': 1,
  984.         'photo-tray': 0,
  985.         'in-tray1': 1,
  986.         'in-tray2': 1,
  987.         'media-path': 1,
  988.         'status-code': TYPE6_STATUS_CODE_MAP.get(status_code, STATUS_PRINTER_IDLE) }
  989.  
  990. PJL_STATUS_MAP = {
  991.     10001: STATUS_PRINTER_IDLE,
  992.     10002: STATUS_PRINTER_OFFLINE,
  993.     10003: STATUS_PRINTER_WARMING_UP,
  994.     10004: STATUS_PRINTER_BUSY,
  995.     10005: STATUS_PRINTER_BUSY,
  996.     10006: STATUS_PRINTER_LOW_TONER,
  997.     10007: STATUS_PRINTER_CANCELING,
  998.     10010: STATUS_PRINTER_SERVICE_REQUEST,
  999.     10011: STATUS_PRINTER_OFFLINE,
  1000.     10013: STATUS_PRINTER_BUSY,
  1001.     10014: STATUS_PRINTER_REPORT_PRINTING,
  1002.     10015: STATUS_PRINTER_BUSY,
  1003.     10016: STATUS_PRINTER_BUSY,
  1004.     10017: STATUS_PRINTER_REPORT_PRINTING,
  1005.     10018: STATUS_PRINTER_BUSY,
  1006.     10019: STATUS_PRINTER_BUSY,
  1007.     10020: STATUS_PRINTER_BUSY,
  1008.     10021: STATUS_PRINTER_BUSY,
  1009.     10022: STATUS_PRINTER_REPORT_PRINTING,
  1010.     10023: STATUS_PRINTER_PRINTING,
  1011.     10024: STATUS_PRINTER_SERVICE_REQUEST,
  1012.     10025: STATUS_PRINTER_SERVICE_REQUEST,
  1013.     10026: STATUS_PRINTER_BUSY,
  1014.     10027: STATUS_PRINTER_MEDIA_JAM,
  1015.     10028: STATUS_PRINTER_REPORT_PRINTING,
  1016.     10029: STATUS_PRINTER_PRINTING,
  1017.     10030: STATUS_PRINTER_BUSY,
  1018.     10031: STATUS_PRINTER_BUSY,
  1019.     10032: STATUS_PRINTER_BUSY,
  1020.     10033: STATUS_PRINTER_SERVICE_REQUEST,
  1021.     10034: STATUS_PRINTER_CANCELING,
  1022.     10035: STATUS_PRINTER_PRINTING,
  1023.     10036: STATUS_PRINTER_WARMING_UP,
  1024.     10200: STATUS_PRINTER_LOW_BLACK_TONER,
  1025.     10201: STATUS_PRINTER_LOW_CYAN_TONER,
  1026.     10202: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1027.     10203: STATUS_PRINTER_LOW_YELLOW_TONER,
  1028.     10204: STATUS_PRINTER_LOW_TONER,
  1029.     10205: STATUS_PRINTER_LOW_BLACK_TONER,
  1030.     10206: STATUS_PRINTER_LOW_CYAN_TONER,
  1031.     10207: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1032.     10208: STATUS_PRINTER_LOW_YELLOW_TONER,
  1033.     10209: STATUS_PRINTER_LOW_BLACK_TONER,
  1034.     10210: STATUS_PRINTER_LOW_CYAN_TONER,
  1035.     10211: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1036.     10212: STATUS_PRINTER_LOW_YELLOW_TONER,
  1037.     10213: STATUS_PRINTER_SERVICE_REQUEST,
  1038.     10214: STATUS_PRINTER_SERVICE_REQUEST,
  1039.     10215: STATUS_PRINTER_SERVICE_REQUEST,
  1040.     10216: STATUS_PRINTER_SERVICE_REQUEST,
  1041.     10217: STATUS_PRINTER_SERVICE_REQUEST,
  1042.     10218: STATUS_PRINTER_LOW_TONER,
  1043.     10300: STATUS_PRINTER_LOW_BLACK_TONER,
  1044.     10301: STATUS_PRINTER_LOW_CYAN_TONER,
  1045.     10302: STATUS_PRINTER_LOW_MAGENTA_TONER,
  1046.     10303: STATUS_PRINTER_LOW_YELLOW_TONER,
  1047.     10304: STATUS_PRINTER_SERVICE_REQUEST,
  1048.     10305: STATUS_PRINTER_SERVICE_REQUEST,
  1049.     10306: STATUS_PRINTER_SERVICE_REQUEST,
  1050.     10307: STATUS_PRINTER_SERVICE_REQUEST,
  1051.     10308: STATUS_PRINTER_SERVICE_REQUEST,
  1052.     10309: STATUS_PRINTER_SERVICE_REQUEST,
  1053.     10310: STATUS_PRINTER_SERVICE_REQUEST,
  1054.     10311: STATUS_PRINTER_SERVICE_REQUEST,
  1055.     10312: STATUS_PRINTER_SERVICE_REQUEST,
  1056.     10313: STATUS_PRINTER_SERVICE_REQUEST,
  1057.     10314: STATUS_PRINTER_SERVICE_REQUEST,
  1058.     10315: STATUS_PRINTER_SERVICE_REQUEST,
  1059.     10316: STATUS_PRINTER_SERVICE_REQUEST,
  1060.     10317: STATUS_PRINTER_SERVICE_REQUEST,
  1061.     10318: STATUS_PRINTER_SERVICE_REQUEST,
  1062.     10400: STATUS_PRINTER_NON_HP_INK,
  1063.     10401: STATUS_PRINTER_IDLE,
  1064.     10402: STATUS_PRINTER_SERVICE_REQUEST,
  1065.     10403: STATUS_PRINTER_IDLE,
  1066.     30119: STATUS_PRINTER_MEDIA_JAM,
  1067.     40021: STATUS_PRINTER_DOOR_OPEN,
  1068.     40022: STATUS_PRINTER_MEDIA_JAM,
  1069.     40038: STATUS_PRINTER_LOW_TONER,
  1070.     40600: STATUS_PRINTER_NO_TONER }
  1071. MIN_PJL_ERROR_CODE = 10001
  1072. DEFAULT_PJL_ERROR_CODE = 10001
  1073.  
  1074. def MapPJLErrorCode(error_code, str_code = None):
  1075.     if error_code < MIN_PJL_ERROR_CODE:
  1076.         return STATUS_PRINTER_BUSY
  1077.     if str_code is None:
  1078.         str_code = str(error_code)
  1079.     
  1080.     if len(str_code) < 5:
  1081.         return STATUS_PRINTER_BUSY
  1082.     status_code = PJL_STATUS_MAP.get(error_code, None)
  1083.     log.debug('Mapped PJL error code %d to status code %d' % (error_code, status_code))
  1084.     return status_code
  1085.  
  1086. pjl_code_pat = re.compile('^CODE\\s*=\\s*(\\d.*)$', re.IGNORECASE)
  1087.  
  1088. def StatusType8(dev):
  1089.     
  1090.     try:
  1091.         dev.openPrint()
  1092.     except Error:
  1093.         e = None
  1094.         log.warn(e.msg)
  1095.         status_code = STATUS_PRINTER_BUSY
  1096.  
  1097.     
  1098.     try:
  1099.         dev.writePrint('\x1b%-12345X@PJL INFO STATUS \r\n\x1b%-12345X')
  1100.         pjl_return = dev.readPrint(1024, timeout = 5, allow_short_read = True)
  1101.         dev.close()
  1102.         log.debug_block('PJL return:', pjl_return)
  1103.         str_code = '10001'
  1104.         for line in pjl_return.splitlines():
  1105.             line = line.strip()
  1106.             match = pjl_code_pat.match(line)
  1107.             if match is not None:
  1108.                 str_code = match.group(1)
  1109.                 break
  1110.                 continue
  1111.         
  1112.         log.debug('Code = %s' % str_code)
  1113.         
  1114.         try:
  1115.             error_code = int(str_code)
  1116.         except ValueError:
  1117.             error_code = DEFAULT_PJL_ERROR_CODE
  1118.  
  1119.         log.debug('Error code = %d' % error_code)
  1120.         status_code = MapPJLErrorCode(error_code, str_code)
  1121.     except Error:
  1122.         status_code = STATUS_PRINTER_HARD_ERROR
  1123.     finally:
  1124.         
  1125.         try:
  1126.             dev.closePrint()
  1127.         except Error:
  1128.             pass
  1129.  
  1130.  
  1131.     agents = []
  1132.     if status_code in (STATUS_PRINTER_LOW_TONER, STATUS_PRINTER_LOW_BLACK_TONER):
  1133.         health = AGENT_HEALTH_OK
  1134.         level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  1135.         level = 0
  1136.     elif status_code == STATUS_PRINTER_NO_TONER:
  1137.         health = AGENT_HEALTH_MISINSTALLED
  1138.         level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  1139.         level = 0
  1140.     else:
  1141.         health = AGENT_HEALTH_OK
  1142.         level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  1143.         level = 100
  1144.     log.debug('Agent: health=%d, level=%d, trigger=%d' % (health, level, level_trigger))
  1145.     agents.append({
  1146.         'kind': AGENT_KIND_TONER_CARTRIDGE,
  1147.         'type': AGENT_TYPE_BLACK,
  1148.         'health': health,
  1149.         'level': level,
  1150.         'level-trigger': level_trigger })
  1151.     if dev.tech_type == TECH_TYPE_COLOR_LASER:
  1152.         level = 100
  1153.         level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  1154.         if status_code == STATUS_PRINTER_LOW_CYAN_TONER:
  1155.             level = 0
  1156.             level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  1157.         
  1158.         log.debug('Agent: health=%d, level=%d, trigger=%d' % (health, level, level_trigger))
  1159.         agents.append({
  1160.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  1161.             'type': AGENT_TYPE_CYAN,
  1162.             'health': AGENT_HEALTH_OK,
  1163.             'level': level,
  1164.             'level-trigger': level_trigger })
  1165.         level = 100
  1166.         level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  1167.         if status_code == STATUS_PRINTER_LOW_MAGENTA_TONER:
  1168.             level = 0
  1169.             level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  1170.         
  1171.         log.debug('Agent: health=%d, level=%d, trigger=%d' % (health, level, level_trigger))
  1172.         agents.append({
  1173.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  1174.             'type': AGENT_TYPE_MAGENTA,
  1175.             'health': AGENT_HEALTH_OK,
  1176.             'level': level,
  1177.             'level-trigger': level_trigger })
  1178.         level = 100
  1179.         level_trigger = AGENT_LEVEL_TRIGGER_SUFFICIENT_0
  1180.         if status_code == STATUS_PRINTER_LOW_YELLOW_TONER:
  1181.             level = 0
  1182.             level_trigger = AGENT_LEVEL_TRIGGER_MAY_BE_LOW
  1183.         
  1184.         log.debug('Agent: health=%d, level=%d, trigger=%d' % (health, level, level_trigger))
  1185.         agents.append({
  1186.             'kind': AGENT_KIND_TONER_CARTRIDGE,
  1187.             'type': AGENT_TYPE_YELLOW,
  1188.             'health': AGENT_HEALTH_OK,
  1189.             'level': level,
  1190.             'level-trigger': level_trigger })
  1191.     
  1192.     if status_code == 40021:
  1193.         top_door = 0
  1194.     else:
  1195.         top_door = 1
  1196.     log.debug('Status code = %d' % status_code)
  1197.     return {
  1198.         'revision': STATUS_REV_UNKNOWN,
  1199.         'agents': agents,
  1200.         'top-door': top_door,
  1201.         'supply-door': top_door,
  1202.         'duplexer': 0,
  1203.         'photo-tray': 0,
  1204.         'in-tray1': 1,
  1205.         'in-tray2': 1,
  1206.         'media-path': 1,
  1207.         'status-code': status_code }
  1208.  
  1209.